
# DatosConsumo se encarga de almacenar los datos asociados a la factura de un usuario.
# @attr number: número de usuario
# @attr totalCalls: número de llamadas que ha realizado el usuario en el último periodo de facturación
# @attr totalSMS: número de SMS que ha enviado el usuario en el último periodo de facturación
# @attr totalTime: duración total de las llamadas
# @attr totalBill: factura total (incluyendo SMS, datos y llamadas)
# @attr consumo: array que contiene información sobre cada número destino: numLlamadas, numSMS, duracion, precio y operador

class DatosConsumo
  attr_accessor :number,:totalCalls,:totalBill,:totalTime, :totalSMS
  def initialize()
    @number
    @totalCalls = 0
    @totalSMS   = 0
    @totalTime  = 0
    @totalBill  = 0
    @consumo = Hash.new 
  end 
  
  def to_json
    aux2={:totalCalls=>self.totalCalls,:totalSMS=>self.totalSMS,:totalTime=>self.totalTime,:totalBill=>self.totalBill,:number => self.number,:consumo=>self.getConsumo()}
    return aux2.to_json
  end

  # Método que se encarga de completar todos datos excepto el número de Teléfono.
  # Parseo puro y duro de la web
  def setConsumo(llamadas)
    totalSMS = 0
    totalTiempo=0
    tr = llamadas.search("//tr[@class='texto']")
    i=3
     
    until i>tr.length-2
    
      #Obtenemos el teléfono
      telefono=tr[i].search("//td")
      tel=telefono[0].inner_html
      tel=tel.delete("^1234567890")
         
      #Obtenemos el operador
      operador=telefono[3].inner_html
      operador=operador.delete("\t")
      operador=operador.delete("\n")
         
      #Obtenemos el precio de la llamada                     
      precio=telefono[7].inner_html
      precio=precio.delete("^01234567890,")
      precio=precio.sub(",",".")
      precio=precio.to_f
      
      #Obtenemos el tipo de conexión y la duración de la llamada (en s)
      duracion=telefono[6].inner_html

      # No tenemos en cuenta la tarificacion por datos
      unless (duracion.scan(/\Kb/).length) > 0
        # SMS
        if (duracion.scan(/\-/).length) > 0
          duracion = 0
          @totalSMS=@totalSMS+1
          #Guardamos en el array final       
          if @consumo.has_key?(tel.to_s)
            actual=@consumo[tel.to_s]
            numero={"numSMS"=>(actual["numSMS"]+1),"numLlamadas"=>actual["numLlamadas"],"operador"=>actual["operador"],"duracion"=>actual["duracion"]+duracion,"precio"=>actual["precio"]+precio}
            @consumo[tel.to_s]=numero
          else
            @consumo[tel.to_s]={"numLlamadas"=>0, "numSMS"=>1,"operador"=>operador,"duracion"=>duracion,"precio"=>precio}
          end
        # Llamada
        else
          @totalCalls+=1
          duracion=duracion.delete("^hms1234567890")
          aux=duracion.scan(/\d+/)
          case aux.length  
            when 1
              duracion=aux[0].to_i
            when 2
              duracion=(aux[0].to_i*60)+aux[1].to_i
            when 3
              duracion=(aux[0].to_i*60)+(aux[1].to_i*60)+aux[2].to_i
            else  
              duracion=0
          end  
          #Guardamos en el array final       
          if @consumo.has_key?(tel.to_s)
            actual=@consumo[tel.to_s]
            numero={"numLlamadas"=>(actual["numLlamadas"]+1),"numSMS"=>actual["numSMS"],"operador"=>actual["operador"],"duracion"=>actual["duracion"]+duracion,"precio"=>actual["precio"]+precio}
            @consumo[tel.to_s]=numero
          else
            @consumo[tel.to_s]={"numLlamadas"=>1,"numSMS"=>0,"operador"=>operador,"duracion"=>duracion,"precio"=>precio}
          end
        end
      else
        duracion = 0
      end
      
      i=i+1
      @totalBill=@totalBill+precio
      @totalTime=@totalTime+duracion
    end
  end

  def getConsumo()
    return @consumo
  end
end